Pesquisa Técnica — Remove Recommended Item
Contexto
Refinamento da task #193232 — endpoint DELETE api/payment/v2/{id}/remove-recommended-item.
Código relevante encontrado
CartController — ausência de remove item
Path: coezzion-service-cart/src/Cart.API/Controllers/CartController.cs
Não existe endpoint de remoção de item individual. O único DELETE existente é DELETE api/cart que remove o cart inteiro via DeleteCartCommand { int Id } (lines 270–288).
CartItemsModel — campos
Path: coezzion-db-core/src/Core.OrgDB/Entities/CartItemsModel.cs
| Campo | Tipo | Observação |
|---|---|---|
Id | int | PK — identificador único do CartItem |
CartId | int | FK para CartModel |
ProductId | int | |
Size | string | |
UnitPrice | decimal | |
Discount | DiscountType | Enum: None/Percentage/Value |
DiscountValue | decimal | |
FullPrice | decimal | |
DiscountOrigin | CartItemDiscountOrigin | Enum: None/Markdown/Manual/Both |
GrossPrice | decimal | |
Total | decimal | |
HasEmployeeDiscount | bool | único bool existente |
Não existe campo IsFromRecommendation ou similar. A ser adicionado em US separada.
CartModel — métodos de remoção
Path: coezzion-db-core/src/Core.OrgDB/Entities/CartModel.cs
Não existe método RemoveItem. Métodos relacionados:
UpdateItems(lines 226–237): remove todos os itens e adiciona nova lista — bulk replaceDelete(lines 241–249): soft-delete em cascata do cart inteiroCalculateTotal(lines 207–224): recalculaItemsTotal,PdvIntegrationValue,Total
Novo método RemoveItem(int cartItemId) precisará ser criado na Cart API.
Product DTO — ausência de cartItemId
Path: coezzion-service-checkout/src/Checkout.Domain/DTO/GetInfo/GetInfoBase.cs (lines 327–360)
O record Product possui: Name, Size, Amount, FullPrice, Price, Total, Url.
cartItemId não está exposto. O Id existe em CartItemsInfoDTO (line 32, populado da query SQL CI."Id") mas é descartado no mapeamento para Product. Será exposto conforme ADR-008.
CartItemsInfoDTO
Path: coezzion-service-checkout/src/Checkout.Domain/DTO/GetInfo/CartInfoDTO.cs (lines 30–41)
Campos: Id, ProductName, UrlThumbnail, GrossPrice, Size, Quantity, UnitPrice, Total, Sku.
O campo Id já é selecionado pela query SQL (CI."Id" Id) e está disponível para exposição no Product DTO sem alteração de query.
PaymentsModel.Total
Path: coezzion-db-link/src/Link.OrgDB/Entities/PaymentsModel.cs (line 25)
Total é decimal, setado na criação do payment com cart.Total. Sem método UpdateTotal — atualização feita diretamente via setter no handler (mesmo padrão do add, conforme ADR-007).
Decisões tomadas durante o refinamento
| # | Questão | Decisão |
|---|---|---|
| 1 | Flag IsFromRecommendation | Será adicionada em US separada (dependência) |
| 2 | Identificador do item no request | cartItemId (body) — zzlink usa o ID retornado no Product DTO |
| 3 | cartItemId no Product DTO | Exposto como campo novo aditivo — ver ADR-008 |
| 4 | Autenticação checkout | [Authorize(AuthenticationSchemes = "PaymentsScheme")] — mesmo do add |
| 5 | Rota checkout | DELETE api/payment/v2/{id}/remove-recommended-item |
| 6 | Retorno 200 | Mesmo shape do add — values, products, paymentMethods, recommendedItems |
| 7 | Rota Cart API | DELETE api/cart/{cartId}/items/{cartItemId} — sem body, [UseApiKey("internal")] |
| 8 | Ajuste Payment.Total | Síncrono no handler — mesmo padrão do add (ADR-007) |
| 9 | Validação janela de validade | Não se aplica ao remove — item já está no cart |
| 10 | Separação em tasks | Duas tasks: checkout (task-04) e Cart API (task-05) |
Nova task identificada
Task 05 — Cart API: Remove Item de cart existente
- Novo endpoint:
DELETE api/cart/{cartId}/items/{cartItemId} - Auth:
[UseApiKey("internal")] - Responsabilidades: localizar item pelo
cartItemId, remover, recalcular totais - Sem body
- Ver: task-05-193232/task-193232-cart-api-remove-item